import pygame
from pygame.sprite import Sprite
"""
Sprite:可见游戏对象的基类
Bullet类继承了从模块pygame.sprite导入的Sprite类。
通过使用精灵（sprite），可将游戏中相关的元素(多个子弹)编组，进而同时操作编组中的所有元素。
"""

# Bullet继承Sprite
class Bullet(Sprite):

    # 管理飞船发射子弹的类
    def __init__(self,ai_game):
        # 在飞船当前位置创建一个子弹对象
        # 为创建子弹实例，__init__()需要当前的AlienInvasion实例，我们还调用了super()来继承Sprite。
        super().__init__()
        # 定义了用于存储屏幕以及设置对象和子弹颜色的属性
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.color = self.settings.bullet_color
        """
        创建子弹的属性rect
        子弹并非基于图像，因此必须使用pygame.Rect()类从头开始创建一个矩形。
        创建这个类的实例时，必须提供矩形左上角的x坐标和y坐标，以及矩形的宽度和高度。
        我们在(0, 0)处创建这个矩形，但下一行代码将其移到了正确的位置，因为子弹的初始位置取决于飞船当前的位置。
        子弹的宽度和高度是从self.settings中获取的。
        """
        self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height)
        """
        将子弹的rect.midtop设置为飞船的rect.midtop。
        这样子弹将从飞船顶部出发，看起来像是从飞船中射出的。
        我们将子弹的y坐标存储为小数值，以便能够微调子弹的速度
        """
        self.rect.midtop = ai_game.ship.rect.midtop

        # 存储用小数表示的子弹的位置
        self.y = float(self.rect.y)

    # 管理子弹的位置
    def update(self):
        # 发射出去后，子弹向上移动，意味着其y坐标将不断减小（更新表示子弹位置的小数值）
        self.y -= self.settings.bullet_speed
        # 更新表示子弹的rect位置
        self.rect.y = self.y
        # 子弹发射后，其x坐标始终不变，因此子弹将沿直线垂直向上飞行。

    # 绘制子弹
    def draw_bullet(self):
        # 在屏幕上绘制子弹（表面，颜色，矩形）
        pygame.draw.rect(self.screen, self.color, self.rect)